package com.lora.service.resolver;

import com.lora.dto.EquipmentDto;
import com.lora.entity.GateMahnetism;
import com.lora.service.GateMahnetismService;
import com.lora.service.NodeDataResolver;
import com.lora.util.StringUtil;
import com.lora.web.BaseUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 门磁感器数据节点解析
 */
@Service("gateMahnetismResolver")
public class GateMahnetismResolver implements NodeDataResolver<GateMahnetism> {

    @Resource
    private GateMahnetismService gateMahnetismServicel;

    /**
     * 帧头：0xFA
     * 数据长度：0x02
     * 报警状态：占用1字节传输报警信息,如0x00表示正常，0x03表示门磁报警。
     * 传感器状态：传感器是否故障，占用bit7, bit6，2bit传输传感器状态，如：00表示正常；01表示传感器故障；10/11保留。
     * 电池状态：电池正常或低电,占用bit5, bit4，2bit传输传感器状态，如：00表示正常；01表示低电；10/11保留。
     * 防拆状态：是否被拆,占用bit3，1bit传输传感器状态，如：0表示正常；1表示被拆。
     * 按键状态：按键状态值,占用bit2,bit0，3bit传输传感器状态，如：000表示正常；001表示测试；
     * CRC16H： CRC16，高字节
     * CRC16L： CRC16，低字节
     * 帧尾：0xF5
     * @param equipmentNumber
     * @param data
     * @return
     */
    @Override
    public EquipmentDto<GateMahnetism> resolve(String equipmentNumber, String data) {
        data = BaseUtil.base64ToHex(data);
        EquipmentDto<GateMahnetism> equipmentData = new EquipmentDto<>();
        GateMahnetism gateMahnetism=new GateMahnetism();
        gateMahnetism.setEquipmentid(equipmentNumber);
        gateMahnetism.setDatalength(data.substring(2,4));
        gateMahnetism.setDatastring(data);
        gateMahnetism.setState(data.substring(4,6));
        String state = data.substring(6, 8);
        state = StringUtil.hexStringToByte(state);
        gateMahnetism.setSensorstate(state.substring(0,2));
        gateMahnetism.setBatterystate(state.substring(2,4));
        gateMahnetism.setTamperstate(state.substring(4,5));
        gateMahnetism.setKeystate(state.substring(5));
        gateMahnetism.setCrchighbytes(data.substring(8, 10));
        gateMahnetism.setCrclowhbytes(data.substring(10, 12));
        gateMahnetism.setFrametail(data.substring(12));
        equipmentData.setEntity(gateMahnetism);
        return equipmentData;
    }

    @Override
    public GateMahnetism save(GateMahnetism equipment, boolean alarmFlag) {
        equipment.setAlarmFlag(alarmFlag);
        gateMahnetismServicel.save(equipment);
        return equipment;
    }


}
